You can experiment by having the ball controlled locally except once in n ticks (say 5 ticks) when the master propagates the latest position and everyone gets back in sync. This is useful to reduce the traffic and load on the master.
Notice that when clients start up the ball is updated only after the next tick goes to the master. For a brief instant before this occurs the ball is at the origin. A useful exercise to prevent this is as follows : when a new client comes up (in the constructor, maybe) have the client go through an initialisation routine. If it is the master the ball position is initialised to the origin. Otherwise it sends rpc to the master asking for the current position of the ball. The master has a method which responds to this by broadcasting the current position and the new client thus gets this information, and starts with the ball correctly positioned. To carry this out you need to add new methods for query and response of the intiial position.